package com.mini.core.dao;

import java.util.Collection;
import java.util.List;

import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;

import com.mini.core.BaseEntity;
import com.mini.core.PageResult;
import com.mini.core.grammar.Record;

/**
 * 通用Dao对象接口
 * @author sxjun
 * 2016-1-15
 */
public interface IMiniDao1 {
	/**
     * 执行sql语句
     * @param sql 执行语句
     * @return int
     */
    public int execute(String sql);
    
    /**
     * 执行sql语句
     * @param sql 执行语句
     * @param paras 参数
     * @return int
     */
    public int execute(String sql, Object... paras);
    
    /**
     * 批量执行sql语句
     * @param sqls 执行语句集合
     * @return int[]
     */
    public int[] executebatch(String[] sqls);
    
    /**
     * 批量执行sql语句
     * @param sql 执行语句
     * @param batchArgs 参数
     * @param batchSize 执行量
     * @param pss
     * @return int[][]
     */
    public int[][] executebatch(String sql, Collection<Object> batchArgs, int batchSize,ParameterizedPreparedStatementSetter<Object> pss);
    
    /**
     * 查询单个字段
     * @param sql 执行语句
     * @return String
     */
    public String queryString(String sql);
    
    /**
     * 查询单个字段
     * @param sql 执行语句
     * @param args 参数
     * @return String
     */
	public String queryString(String sql, Object... args);
	
	/**
     * 查询单个字段集合，只支持简单基本类型（Integer, Double, Float, Long, Short, Boolean, Byte, Char）的查询
     * @param sql 执行语句
     * @return List<T>
     */
    public <T> List<T> queryList(String sql,Class<T> clazz);
    
    /**
     * 查询单个字段集合，只支持简单基本类型（Integer, Double, Float, Long, Short, Boolean, Byte, Char）的查询
     * @param sql 执行语句
     * @param args 参数
     * @return List<T>
     */
	public <T> List<T> queryList(String sql, Class<T> clazz, Object... args);
	
	/**
	 * 查询单个字段
	 * @param sql 执行语句
	 * @return int
	 */
	public int queryInt(String sql);
	
	/**
	 * 查询单个字段
	 * @param sql 执行语句
	 * @param args 参数
	 * @return int
	 */
	public int queryInt(String sql, Object... args);
	
	/**
	 * 根据ID查找对象
	 * @param clazz 类<必须继承BaseEntity>
	 * @param primaryKey
	 * @return T extends BaseEntity
	 */
	public <T extends BaseEntity> T findById(Class<? extends BaseEntity> clazz, Object primaryKey);
	
	/**
	 * 查找Record的List对象
	 * @param sql 执行语句
	 * @return List<Record>
	 */
	public List<Record> findRecordList(String sql);
	
	/**
	 * 查找Record的List对象
	 * @param sql 执行语句
	 * @param args 参数
	 * @return List<Record>
	 */
	public List<Record> findRecordList(String sql, Object... args);
	
	/**
	 * 查找BaseEntity的List对象
	 * @param sql 执行语句
	 * @param clazz 类<必须继承BaseEntity>
	 * @return T extends BaseEntity
	 */
	public <T extends BaseEntity> List<T> findList(String sql,Class<? extends BaseEntity> clazz);
	
	/**
	 * 查找BaseEntity的List对象
	 * @param sql 执行语句
	 * @param clazz 类<必须继承BaseEntity>
	 * @param args 参数
	 * @return T extends BaseEntity
	 */
	public <T extends BaseEntity> List<T> findList(String sql,Class<? extends BaseEntity> clazz, Object... args);
	
	/**
	 * 查找单个Record对象
	 * @param sql 执行语句
	 * @return Record
	 */
	public Record findRecord(String sql);
	
	/**
	 * 查找单个Record对象
	 * @param sql 执行语句
	 * @param args 参数
	 * @return Record
	 */
    public Record findRecord(String sql, Object... args);
    
    /**
     * 查找单个BaseEntity对象
     * @param sql 执行语句
     * @param clazz 类<必须继承BaseEntity>
     * @return T extends BaseEntity
     */
    public <T extends BaseEntity> T find(String sql,Class<? extends BaseEntity> clazz);
    
    /**
     * 查找单个BaseEntity对象
     * @param sql 执行语句
     * @param clazz 类<必须继承BaseEntity>
     * @param args 参数
     * @return T extends BaseEntity
     */
    public <T extends BaseEntity> T find(String sql,Class<? extends BaseEntity> clazz, Object... args);
    
    /**
     * 插入数据
     * @param record BaseEntity或Record对象 <必须继承Record>
     * @return int
     */
    public <T extends Record>  int insert(T record);
    
    /**
     * 更新数据
     * @param record BaseEntity或Record对象 <必须继承Record>
     * @return int
     */
    public <T extends Record> int update(T record);
    
    /**
     * 删除数据
     * @param record BaseEntity或Record对象 <必须继承Record>
     * @return int
     */
    public <T extends Record> int delete(T record);
    
    /**
	 * 根据ID删除数据
	 * @param clazz 类<必须继承BaseEntity>
	 * @param primaryKey
	 * @return int
	 */
	public int deleteById(Class<? extends BaseEntity> clazz, Object primaryKey);
	
    /**
     * 获取分页Record数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param sql 执行语句
     * @return List<Record>
     */
    public List<Record> paginate(int pageNumber, int pageSize, String sql);
    
    /**
     * 获取分页Record数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param sql 执行语句
     * @param args 参数
     * @return List<Record>
     */
    public List<Record> paginate(int pageNumber, int pageSize, String sql, Object... args);
    

    /**
     * 获取分页BaseEntity数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param clazz 类<必须继承BaseEntity>
     * @param sql 执行语句
     * @return List<T extends BaseEntity>
     */
    public <T extends BaseEntity> List<T> paginate(int pageNumber, int pageSize, Class<? extends BaseEntity> clazz, String sql);
    
    /**
     * 获取分页BaseEntity数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param clazz 类<必须继承BaseEntity>
     * @param sql 执行语句
     * @param args 参数
     * @return List<T extends BaseEntity>
     */
    public <T extends BaseEntity> List<T> paginate(int pageNumber, int pageSize, Class<? extends BaseEntity> clazz, String sql, Object... args);
    
    /**
     * 获取分页Record数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param sql 执行语句
     * @return PageResult<Record>
     */
    public PageResult<Record> paginateResult(int pageNumber, int pageSize, String sql);
    
    /**
     * 获取分页Record数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param sql 执行语句
     * @param args 参数
     * @return PageResult<Record>
     */
    public PageResult<Record> paginateResult(int pageNumber, int pageSize, String sql, Object... args);
    
    /**
     * 获取分页BaseEntity数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param clazz 类<必须继承BaseEntity>
     * @param sql 执行语句
     * @return PageResult<T>
     */
    public <T extends BaseEntity> PageResult<T> paginateResult(int pageNumber, int pageSize, Class<? extends BaseEntity> clazz, String sql);
    
    /**
     * 获取分页BaseEntity数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param clazz 类<必须继承BaseEntity>
     * @param sql 执行语句
     * @param args 参数
     * @return PageResult<T>
     */
    public <T extends BaseEntity> PageResult<T> paginateResult(int pageNumber, int pageSize, Class<? extends BaseEntity> clazz, String sql, Object... args);
}
